package com.oms.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.oms.dao.BaseDao;
import com.oms.util.ReflectUtil;

/**
 * 通用基础类
 * @author junfy
 *
 * @param <T>	具体操作持久层的实体类
 */
public class BaseDaoImpl<T>  implements BaseDao<T>{  
    
    private SessionFactory sessionFactory;  
    //Class<?>:防止报黄线,意思是传入任意类型都行,无所谓,也可以使用Object  
    private Class<?> entityClass;  
      
    public BaseDaoImpl(){  
        //new出一个子类对象，父类中的this是子类中的this  
        entityClass = ReflectUtil.getGenericParameterType(this.getClass());  
    }  
    
    /**
     * 出入对象，作为数据行插入表中
     */
	@Override
	public Serializable save(T t) {
		return getSession().save(t);
	}  
    
    /**
     * 传入对象，更新某个对象的信息
     * @param t
     */
    public void update(T t){  
        getSession().update(t);  
    }  
    
    /**
     * 传入主键，删除该主键的对象
     * @param pk
     */
    public void del(Serializable pk){  
        getSession().delete(findById(pk));  
    }
    
    
    /**
     * 出入对象，删除该对象
     * @param t
     */
    public void del(T t){  
        getSession().delete(t);  
    }
    
    /**
     * 通过hql和参数获取满足条件的总条目
     */
	@Override
	public int count(String hql, Object... params) {
	    Query query = getSession().createQuery(hql);
	    for (int i = 0; params != null && i < params.length; i++)
			query.setParameter(i+"", params[i]);
	    return ((Long)query.uniqueResult()).intValue();
	}
    
    /**
     * 传入主键pk，查找返回对应的对象
     * @param pk
     * @return
     */
    @SuppressWarnings("unchecked")  
    public T findById(Serializable pk){  
        return (T) getSession().get(entityClass, pk);  
    }  
    
    /**
     * 查询返回所有的对象集
     * @return
     */
    @SuppressWarnings("unchecked")  
    public List<T> findAll(){  
        Criteria criteria = getSession().createCriteria(entityClass);  
        return criteria.list();  
    }  
    
    /**
     * 传入开始条目和结束条目，无条件查询所有对象，返回相应条目对象集
     * @param start
     * @param count
     * @return
     */
    @SuppressWarnings("unchecked")  
    public List<T> findByPage(int start,int count){  
        Criteria criteria = getSession().createCriteria(entityClass);  
        criteria.setFirstResult(start);  
        criteria.setMaxResults(count);  
        return criteria.list();  
    } 
    
    /**
     * 传入查询语句hql和查询参数params数组，查找相应的对象集
     * @param hql
     * @param params
     * @return
     */
	@SuppressWarnings("unchecked")
	public List<T> list(String hql, Object... params){
		Query query = getSession().createQuery(hql);
		for (int i = 0; params != null && i < params.length; i++)
			query.setParameter(i+"", params[i]);
		//设置参数;
		return query.list();//返回总数
	}
    
	/**
	 * 传入查询语句hql和查询参数params数组，查找返回符合条件的对象数目
	 * @param hql
	 * @param params
	 * @return
	 */
	public int getTotalCount(String hql, Object... params){
		Query query = getSession().createQuery(hql);
		for (int i = 0; params != null && i < params.length; i++)
			query.setParameter(i+"", params[i]);
		//设置参数
		return query.list().size();		
	}

	/**
	 * 传入查询语句hql、查询参数params、首记录firstResult、查询数maxResults，查询返回符合条件的对象集
	 * @param hql
	 * @param firstResult
	 * @param maxResults
	 * @param params
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<T> listWithPage(String hql, int firstResult, int maxResults,Object... params){
		Query query = getSession().createQuery(hql);
		for (int i = 0; params != null && i < params.length; i++){
			query.setParameter(i+"", params[i]);				//设置参数			
		}
		return query.setFirstResult(firstResult).setMaxResults(maxResults).list();			//返回查询页的信息
	}
      
    //get  
    public Session getSession(){  
        return sessionFactory.getCurrentSession();  
    }  
      
    //set  
    @Autowired  
    public void setSessionFactory(SessionFactory sessionFactory) {  
        this.sessionFactory = sessionFactory;  
    }

}  
       